package cn.study.base;

import com.lmax.disruptor.RingBuffer;
import com.lmax.disruptor.dsl.Disruptor;

import java.nio.ByteBuffer;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

/**
 * disruptor3.0支持lambda表达式
 * 可用lambda表示是简化书写，不用单独写处理类
 *
 * @Author: 陈胜
 * @Date: 2018/2/26 13:51
 */
public class LongEventMainJava8 {
    /**
     * 用lambda表达式来注册EventHandler和EventProductor
     * @param args
     * @throws InterruptedException
     */
    public static void main(String[] args) throws InterruptedException {
        // 创建缓冲线程池
        ExecutorService executor = Executors.newCachedThreadPool();
        // 创建bRingBuffer大小，2的N次方
        int bufferSize = 1024;

        // LongEvent::new 表示 new LongEvent()
        Disruptor<LongEvent> disruptor = new Disruptor<>(LongEvent::new, bufferSize, executor);
        // 可以使用lambda来注册一个EventHandler
        /**
         * 连接消费事件方法
         *
         * 原本是disruptor.handleEventsWith(new LongEventHandler());需要传入一个handler
         * disruptor支持jdk8，可以直接使用lambda表达式，实现消费者业务处理逻辑
         */
        disruptor.handleEventsWith((event, sequence, endOfBatch) -> System.out.println("customer: " + event.getValue()));
        // 启动disruptor
        disruptor.start();
        // 发布事件（获取存放数据的容器）
        RingBuffer<LongEvent> ringBuffer = disruptor.getRingBuffer();

        // 实例化生产者，并将RingBuffer容器注入到生产者
        //LongEventProducer producer = new LongEventProducer(ringBuffer);

        ByteBuffer bb = ByteBuffer.allocate(8);
        for (long l = 0; l<100; l++) {
            bb.putLong(0, l);
            // 使用lambda表达式实现生产者的业务处理逻辑,不需要使用producer.onData
            ringBuffer.publishEvent((event, sequence, buffer) -> {
                event.setValue(buffer.getLong(0));
                System.out.println("producer: " + event.getValue());
            }, bb);
            //Thread.sleep(1000);
        }

        disruptor.shutdown();// 关闭 disruptor，方法会堵塞，直至所有的事件都得到处理；
        executor.shutdown();// 关闭 disruptor 使用的线程池；如果需要的话，必须手动关闭， disruptor 在 shutdown 时不会自动关闭；
    }
}
